package cn.remex.task;

import cn.remex.core.RemexApplication;
import cn.remex.core.exception.ServiceCode;
import cn.remex.core.quartz.Job;
import cn.remex.core.util.Assert;
import cn.remex.db.Database;
import cn.remex.task.model.SysMatter;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import static cn.remex.task.TaskConst.ProcessStatus.*;

/**
 * 名称：
 * 缩写：
 * 用途：
 * Created by yangy on 2016/12/24 0024.
 */
public abstract class MatterBase extends Job implements TaskConst {
	@Override
	public void jobExecute(JobExecutionContext ctx) throws JobExecutionException {
		SysMatter matter= (SysMatter) ctx.getJobDetail().getJobDataMap().get("jobConfig");
		logger.info("启动信审任务，type={}, param={}", matter.getMatterType(), matter.getParams());

		try {
			Assert.notNull(matter, ServiceCode.FAIL,"信审分析工作配置不能为空");
			matter = creditJobExecute(matter, ctx);

			//保存调用结果
			Database.store(matter).execute();
			TaskConst.logger.error("信审工作处理完成：{}", matter.getResults());
		} catch (TaskException e) {
			//所有跑出信审异常的认为是任务失败而不是错误
			TaskConst.logger.error("信审工作处理失败：{}", e);
			Database.update(SysMatter.class)
					.filterById(matter.getId())
					.assignColumn(SysMatter::getProcessStatus, FAIL)
					.assignColumn(SysMatter::getResults, e.toString())
					.execute().assertEffectOneRow(ServiceCode.FAIL,"信审job状态更新 FAIL 失败");
		} catch (Throwable t) {
			//框架非信审异常和系统未考虑到的异常，则任务服务错误
			TaskConst.logger.error("信审工作处理错误：{}", t);
			Database.update(SysMatter.class)
					.filterById(matter.getId())
					.assignColumn(SysMatter::getProcessStatus, ERROR)
					.assignColumn(SysMatter::getResults, t.toString())
					.execute().assertEffectOneRow(ServiceCode.FAIL,"信审job状态更新 ERROR 失败");
		}
		//任何job执行完都会发布本事件
		RemexApplication.publishEvent(new MatterEvent(matter.getMatterType(), matter, matter.getProcessStatus()));

	}

	public abstract SysMatter creditJobExecute(SysMatter config, JobExecutionContext ctx);
}